﻿using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TheBullysStore.Controllers;
using TheBullysStore.Models.ModuloServicios.Incidencia;
using System.Data.SqlClient;
using log4net;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

namespace TheBullysStore.Models.ModuloServicios.Incidencia
{
    public class IncidenciaDAO
    {
        private static ILog log = LogManager.GetLogger(typeof(IncidenciaDAO));
        public IncidenciaBean RegistrarIncidencia(IncidenciaBean incidencia)
        {
            IncidenciaBean incidenciaaux = new IncidenciaBean();
            SqlConnection sqlCon = null;
            try
            {
                if (incidencia.IdUsuario == 0)
                {

                    String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                    sqlCon = new SqlConnection(cadenaConfiguracion);

                    Random r = new Random();
                    Double num = r.NextDouble();
                    num = Math.Round(num, 5);
                    string numerito = Convert.ToString(num);

                    sqlCon.Open();
                    int tem_estado = 1;
                    string commandString;

                    if (incidencia.IdMantenible == 0)
                    {
                        commandString = "INSERT INTO incidencia (Fecha_hora,Nombre,lugar,tipo_incidencia,id_edificio,estado,observacion) " +
                                               " VALUES (convert(datetime,'" + incidencia.FechaIncidencia + "',103), '" + incidencia.NombreIncidencia + "','" + numerito + "', '" + incidencia.IdTipoIncidencia + "','" + incidencia.IdEdificio + "','" + tem_estado + "','" + incidencia.ObservacionIncidencia + "')";

                    }
                    else
                    {
                        commandString = "INSERT INTO incidencia (Fecha_hora,Nombre,lugar,tipo_incidencia,id_edificio,id_mantenible,estado,observacion) " +
                                               " VALUES (convert(datetime,'" + incidencia.FechaIncidencia + "',103), '" + incidencia.NombreIncidencia + "','" + numerito + "', '" + incidencia.IdTipoIncidencia + "','" + incidencia.IdEdificio + "','" + incidencia.IdMantenible + "','" + tem_estado + "','" + incidencia.ObservacionIncidencia + "')";

                    }
                    SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                    sqlCmd.ExecuteNonQuery();
                    sqlCon.Close();

                    SqlConnection sqlCon1 = new SqlConnection(cadenaConfiguracion);
                    sqlCon1.Open();

                    string commandString1 = "SELECT max(id_incidencia) from incidencia where estado=1 and lugar='"+numerito+"' and Nombre='"+incidencia.NombreIncidencia+"'"; 

                    SqlCommand sqlCmd1 = new SqlCommand(commandString1, sqlCon1);

                    incidenciaaux.IdIncidencia = System.Convert.ToInt32(sqlCmd1.ExecuteScalar());
                    sqlCon1.Close();

                    if (incidencia.Opcion == 24) incidenciaaux.Conexion = "Se ingreso correctamente la Incidencia";
                    else
                        incidenciaaux.Conexion = "agregado";

                }
                else
                {
                    if (incidencia.IdUsuario > 0)
                    {

                        string commandString = "INSERT INTO incidencia_x_habitante (id_incidencia, id_habitante) " +
                       "VALUES(" + incidencia.IdIncidencia + ", " + incidencia.IdUsuario + ")";

                        String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
                        sqlCon = new SqlConnection(cadenaConfiguracion);
                        sqlCon.Open();
                        SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                        sqlCmd.ExecuteNonQuery();
                        sqlCon.Close();

                        incidenciaaux.IdIncidencia = incidencia.IdIncidencia;
                        incidenciaaux.Conexion = "incidencia_x_habitante";
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error("RegistrarContratoPreventivo(EXCEPTION): ", ex);
                throw ex;
            }
            return incidenciaaux;
        }

        public Boolean ExisteIncidencia(IncidenciaBean incidencia)
        {
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                SqlConnection sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();
                //??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
                string commandString = "SELECT * FROM incidencia WHERE nombre = '" + incidencia.NombreIncidencia + "' AND estado = 1";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                if (dataReader.Read())
                {
                    IncidenciaBean Incidencia = new IncidenciaBean();

                    Incidencia.IdIncidencia = (int)dataReader["id_incidencia"];
                    Incidencia.NombreIncidencia = (string)dataReader["Nombre"];

                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }

        public List<IncidenciaBean> ListarIncidencia(IncidenciaBean incidencia)
        {
            SqlConnection sqlCon = null;
            try
            {
                List<IncidenciaBean> listaincidencia = new List<IncidenciaBean>();
                string tem_fechafin = "12/12/2200";
                string tem_fechainicio = "12/12/1900";
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                string commandString = "select  a.*,b.Nombre,c.Nombre from incidencia a inner join (select * from edificio where estado=1) b on a.id_Edificio=b.id_Edificio left join (select * from mantenible where estado=1) c on c.id_mantenible=a.id_mantenible where a.estado=1";

                if (!string.IsNullOrEmpty(incidencia.NombreIncidencia))
                {
                    commandString += " AND a.nombre LIKE '%" + incidencia.NombreIncidencia + "%'";
                }

                if (incidencia.IdMantenible > 0)
                {
                    commandString += " AND a.Id_mantenible = " + incidencia.IdMantenible + "";
                }


                if (incidencia.IdEdificio > 0)
                {
                    commandString += " AND a.Id_edificio = " + incidencia.IdEdificio + "";
                }

                if (!string.IsNullOrEmpty(incidencia.IdTipoIncidencia))
                {
                    commandString += " AND a.tipo_incidencia LIKE '%" + incidencia.IdTipoIncidencia + "%'";
                }

                if (!string.IsNullOrEmpty(incidencia.ObservacionIncidencia))
                {
                    commandString += " AND a.observacion LIKE '%" + incidencia.ObservacionIncidencia + "%'";
                }

                if (!string.IsNullOrEmpty(incidencia.LugarIncidencia))
                {
                    commandString += " AND a.lugar LIKE '%" + incidencia.LugarIncidencia + "%'";
                }

                if ((!string.IsNullOrEmpty(incidencia.FechaInicial)) && (!string.IsNullOrEmpty(incidencia.FechaFinal)))
                {
                    commandString += " AND a.fecha_hora BETWEEN convert(datetime,'" + incidencia.FechaInicial + "',103)"
                                   + " AND convert(datetime,'" + incidencia.FechaFinal + "',103)";
                }
                else if (!string.IsNullOrEmpty(incidencia.FechaInicial))
                {

                    commandString += " AND a.fecha_hora BETWEEN convert(datetime,'" + incidencia.FechaInicial + "',103)"
                                   + " AND convert(datetime,'" + tem_fechafin + "',103)";

                }
                else if (!string.IsNullOrEmpty(incidencia.FechaFinal))
                {

                    commandString += " AND a.fecha_hora BETWEEN convert(datetime,'" + tem_fechainicio + "',103)"
                                   + " AND convert(datetime,'" + incidencia.FechaFinal + "',103)";

                }

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    IncidenciaBean Incidencia = new IncidenciaBean();
                    Incidencia.IdIncidencia = Convert.ToInt32(dataReader[0]);
                    Incidencia.FechaIncidencia = String.Format("{0:dd/MM/yyyy}", dataReader[5]);
                    Incidencia.NombreIncidencia = Convert.ToString(dataReader[3]);
                    Incidencia.IdTipoIncidencia = Convert.ToString(dataReader[1]);
                    Incidencia.LugarIncidencia = Convert.ToString(dataReader[4]);
                    Incidencia.ObservacionIncidencia = Convert.ToString(dataReader[7]);
                    if (Convert.IsDBNull(dataReader[6]))
                    {

                        Incidencia.IdMantenible = 0;
                        Incidencia.NombreMantenible = "Mantenible No Relacionado";
                    }
                    else { 
                        
                        Incidencia.IdMantenible = Convert.ToInt32(dataReader[6]);
                        Incidencia.NombreMantenible = Convert.ToString(dataReader[10]);
                    }

                    Incidencia.IdEdificio = Convert.ToInt32(dataReader[2]);
                    Incidencia.NombreEdificio = Convert.ToString(dataReader[9]);

                    Incidencia.EstadoIncidencia = (int)dataReader[8];
                    listaincidencia.Add(Incidencia);

                }
                dataReader.Close();


                return listaincidencia;
            }
            catch (Exception ex)
            {
                log.Error("listarEdificio(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }

        public string ModificarIncidencia(IncidenciaBean incidencia)//////////////////////////////////////////////////////////////////////////////
        {
            SqlConnection sqlCon = null;

            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();
                string commandString;

                int tem_estado = 1;

                if (incidencia.IdMantenible == 0)
                {

                    commandString = "UPDATE incidencia SET " +
                          "Fecha_Hora = '" + incidencia.FechaIncidencia + "' , " +
                          "Nombre = '" + incidencia.NombreIncidencia + "' , " +
                          "observacion = '" + incidencia.ObservacionIncidencia + "' , " +
                          "id_mantenible = '" + incidencia.IdMantenible + "' , " +
                          "lugar = '" + incidencia.LugarIncidencia + "' , " +
                          "id_mantenible =  null , " +
                          "id_edificio = '" + incidencia.IdEdificio + "' , " +
                          "tipo_incidencia = '" + incidencia.IdTipoIncidencia + "' " +

                          "WHERE id_incidencia = " + incidencia.IdIncidencia + " ";
                }
                else
                {
                    commandString = "UPDATE incidencia SET " +
                                              "Fecha_Hora = '" + incidencia.FechaIncidencia + "' , " +
                                              "Nombre = '" + incidencia.NombreIncidencia + "' , " +
                                              "observacion = '" + incidencia.ObservacionIncidencia + "' , " +
                                              "id_mantenible = '" + incidencia.IdMantenible + "' , " +
                                              "lugar = '" + incidencia.LugarIncidencia + "' , " +
                                              "id_edificio = '" + incidencia.IdEdificio + "' , " +
                                              "tipo_incidencia = '" + incidencia.IdTipoIncidencia + "'  " +
                                             
                                              "WHERE id_incidencia = " + incidencia.IdIncidencia + " ";

                }

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);


                sqlCmd.ExecuteNonQuery();

                incidencia.Conexion = "Bien";

            }
            catch (Exception ex)
            {
                log.Error("EliminarEdificio(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
            return incidencia.Conexion;
        }

        public string EliminarIncidencia(IncidenciaBean incidencia)
        {
            SqlConnection sqlCon = null;
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                int elim_estado = 0;


                string commandString = "UPDATE incidencia SET " +
                                       "estado = '" + elim_estado + "'" +
                                       "WHERE id_incidencia = '" + incidencia.IdIncidencia + "'";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();

                incidencia.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                log.Error("EliminarEdificio(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
            return incidencia.Conexion;
        }

        public List<IncidenciaBean> ListarIncidenciaxHabitante(IncidenciaBean incidencia)
        {
            SqlConnection sqlCon = null;
            try
            {
                List<IncidenciaBean> listaincidencia = new List<IncidenciaBean>();
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                string commandString = "SELECT a.*,b.* from incidencia_x_habitante a inner join (select v.*,x.iddep,x.Numero_dep 'Departamento',x.es_inquilino from persona v inner join (select l.*,m.id_departamento 'iddep',m.numero 'Numero_dep' from habitante l inner join departamento m on l.id_departamento=m.id_departamento) x on v.id_persona=x.id_persona where v.estado=1) b on a.id_habitante=b.id_persona";


                if (incidencia.IdIncidencia > 0)
                {
                    commandString += " AND a.Id_incidencia = " + incidencia.IdIncidencia + "";
                }


                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    IncidenciaBean Incidencia = new IncidenciaBean();
                    Incidencia.TipoDocUsuario = Convert.ToString(dataReader[11]);
                    Incidencia.NumeroDocUsuario= Convert.ToString(dataReader[6]);
                    Incidencia.NombresUsuario = Convert.ToString(dataReader[3]);
                    Incidencia.ApellidoUsuario = Convert.ToString(dataReader[4]);
                    Incidencia.GeneroUsuario = Convert.ToInt32(dataReader[10]);
                    Incidencia.DepartamentoUsuario = Convert.ToInt32(dataReader[22]);
                    Incidencia.EsinquilinoUsuario = Convert.ToInt32(dataReader[23]);
                    listaincidencia.Add(Incidencia);

                }
                dataReader.Close();

                return listaincidencia;
            }
            catch (Exception ex)
            {
                log.Error("listarEdificio(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }

    }
}